/**
 * Created with JetBrains PhpStorm.
 * User: power_yin
 * Date: 13-9-16
 * Time: 上午10:09
 * To change this template use File | Settings | File Templates.
 */
/**
 * 公用类库
 */
(function(xf){
    "use strict";
    /**
     * @desc 二节点 堆栈
     */
    xf.Node2Stack = (function(){
        return function(){
            /**
             * @param newHashSet
             */
            var push = function( newHashSet ){    //push 方法的具体实现
                stack.prev = stack.current;
                if(stack.prev !== null){
                    for(var item in stack.prev){
                        stack.prev[item].resume(); //回复每一个节点
                    }
                }
                stack.current = newHashSet;
            }
            var stack = {prev: null, current: null, push: push};
            //this 开启对象特性，是闭包 可以通过 new 关键字 实现 闭包隔离
            return this.stack = stack;
        };
    })();
    /**
     * @desc 运动节点对象
     *    time：缓动经历过的时间
     *    beforeMove：起始位置
     *    changeDistance：起始位置与目标位置的距离,也就是距离上的一个变化量
     *    duration：我们要求对象从起始位置移动到目标位置所需的时间，也就是缓动的总时长
     */
    xf.Tween = xf.Tween || {};
    xf.Tween.Motion = (function(){
        function Motion(){
            this.time = 0;
            /*
            this.beforeMove = tweenHashParam.beforeMove;
            this.changeDistance = tweenHashParam.changeDistance;
            this.duration = tweenHashParam.duration;
            this.TweenFn = function(time, beforeMove, changeDistance, duration) {
                return tweenHashParam.MoverTweenType(time, beforeMove, changeDistance, duration);
            };*/
            this._timerId = 0;
            this.callback = new Function;
            this.resumeCallback = new Function;
        }

        /**
         * @returns {XF.Tween.Motion}
         */
        Motion.createMotionNode = function(){
            return new XF.Tween.Motion();
        };
        /**
         * 初始化节点
         * @param TweenHashParam = {
         *
         * "MoverTweenType" : XF.Tween.Quad.easeOut,   //Tween 运动类型
         *  "beforeMove" : 0,                           //起始位置
         *  "changeDistance" : 200,                     //起始位置与目标位置的距离,也就是距离上的一个变化量
         *  "duration" : 80                             //我们要求对象从起始位置移动到目标位置所需的时间，也就是缓动的总时长
         *  }
         */
        Motion.prototype.initNode = function(tweenHashParam){
             this.beforeMove = tweenHashParam.beforeMove;
             this.changeDistance = tweenHashParam.changeDistance;
             this.duration = tweenHashParam.duration;
             this.TweenFn = function(time, beforeMove, changeDistance, duration) {
                return tweenHashParam.MoverTweenType(time, beforeMove, changeDistance, duration);
             };
        };
        /**
         * @param changer //每次变化都会 将 MoverTweenType 得到的结果 回传到该回调函数
         * @returns {*}
         */
        Motion.prototype.on = function(changer){
            var $this = this;
            this._timerId = setInterval(function(){
                $this.time++;
                if (false === changer($this.TweenFn($this.time, $this.beforeMove, $this.changeDistance, $this.duration)) || $this.time == $this.duration) {
                    if ($this.callback && typeof $this.callback == 'function') $this.callback();
                    clearInterval( $this._timerId );
                }
            }, 10);
            return this;
        };
        /**
         * 停止动画
         * @returns {*}
         */
        Motion.prototype.off = function(){
            clearInterval( this._timerId );
            return this;
        };
        /**
         * @desc 动画执行完成之后执行的 回调
         *
         * @param callback
         * @returns {*}
         */
        Motion.prototype.call = function(callback){
            this.callback = callback;
            return this;
        };
        /**
         * @desc 为了 让 Motion 于 Node2Stack 兼容 运行 创建 该方法
         * @returns {*}
         */
        Motion.prototype.resume = function(){
            this.resumeCallback();
        };
        /**
         * @desc 为了 让 Motion 于 Node2Stack 兼容 运行 创建 该方法
         * @param callback
         * @returns {*}
         */
        Motion.prototype.regResumeFn= function(callback){
            this.resumeCallback = callback;
            return this;
        };
        return Motion;
    })();
})( XF || ( XF = {} ) );